/**
 *  功能：ESP8266 Mqtt客户端调试主题功能，订阅OneNet Mqtt工具发过来的控制Led消息
 *  作者：lhl
 *  时间：2020年8月8日 13:59:48
 *  描述：
 *      1.OneNet平台端：提前在OneNet平台创建DeviceA，DeviceB两个设备点，DeviceA属于NodeMcu，DeviceB属于OneNet Mqtt调试工具
 *      2.初始化工作：初始化网络配置，Mqtt客户端配置，连接鉴权，订阅主题
 *      3.订阅消息：获取发送过来的消息（json格式），解析消息，实现控制亮灭灯
 *
*/
#include "espUtils.h"
#include "onenet.h"

int state;
WiFiClient espClient;
ESP8266WiFiMulti WiFiMulti;

// 声明方法
void initSystem();
void initOneNetMqtt();
void callback(char *topic, byte *payload, unsigned int length);

// 初始化
void setup()
{
    initSystem();
    initOneNetMqtt();
}

void loop() {
    state = connectToOneNetMqtt();
    if(state == ONENET_RECONNECT) {
        // 重连成功 需要重新注册
        mqttClient.subscribe(TOPIC, 1);
        mqttClient.loop();
    } else if (state == ONENET_CONNECTED) {
        mqttClient.loop();
        // Serial.println("state == ONENET_CONNECTED");
    }
    delay(2000);
}

void initSystem() {
    Serial.println("\r\n\r\nStart ESP8266 MQTT");
    Serial.print("Firmware Version:");
    // 串口初始化波特率
    Serial_Init(115200);
    WiFi.mode(WIFI_STA);
    WiFiMulti.addAP("cyq", "77011000");           //连接WIFI1
    WiFiMulti.addAP("123321", "1242473075");      //连接WIFI2
    WaitWiFi_Connect();             // 如果WiFi没有连接，一直循环打印点
    pinMode(LED_BUILTIN, OUTPUT);

}
void initOneNetMqtt() {
    mqttClient.setServer(mqttServer,mqttPort);
    mqttClient.setClient(espClient);
    mqttClient.setCallback(callback);
    initOneNet(PRODUCT_ID, API_KEY, DEVICE_ID);
}
void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
    }
    Serial.println();

    if ((char)payload[0] == '1') {
        digitalWrite(LED_BUILTIN, LOW);
    } else {
        digitalWrite(LED_BUILTIN, HIGH);
    }
}
